package main

import (
	"fmt"
	"math/rand"
	"sort"
	"strconv"
)

// 只要实现了sort.Interface的三个方法
func main() {
	//testSortInts()
	testSortSort()
}

func testSortSort() {
	var heroList HeroSlice
	for i := 0; i < 10; i++ {
		h := Hero{
			Name: "英雄" + strconv.Itoa(i),
			Age:  rand.Intn(100),
		}
		heroList = append(heroList, h)
	}
	for _, hero := range heroList {
		fmt.Println(hero)
	}

	fmt.Println("---------------------")
	//调用方法进行排序
	sort.Sort(heroList)
	for _, hero := range heroList {
		fmt.Println(hero)
	}
}

// Hero 申明一个结构体
type Hero struct {
	Age  int
	Name string
}

// HeroSlice 自定义类型：实现Len \ Less \ Swap 三个方法，然后调用 func Sort(data Interface) 可以实现排序
type HeroSlice []Hero

// Len 实现Interface接口的方法一
func (hs HeroSlice) Len() int {

	return len(hs)
}

// Less 实现Interface接口的方法二
func (hs HeroSlice) Less(i, j int) bool {
	return hs[i].Age < hs[j].Age
}

// Swap 实现Interface接口的方法三
func (hs HeroSlice) Swap(i, j int) {
	//temp := hs[i]
	//hs[i] = hs[j]
	//hs[j] = temp
	hs[i], hs[j] = hs[j], hs[i]
}

// 测试sort.Ins()
func testSortInts() {
	var slice = []int{1, 0, 9, 4}
	sort.Ints(slice)
	fmt.Println(slice) //[0 1 4 9]

}
